<?php


namespace App\Helpers\WatchDog;


use App\Traits\GuzzleHttpTrait;
use Throwable;

class Messages
{
	use GuzzleHttpTrait;

	// $accessTokens
	protected static array $accessTokens = [];
	// host
	protected static string $watchDogHost = '';

	// 默认发送
	protected static bool $defaultSend = true;

	/**
	 * @var ?Messages
	 */
	private static ?Messages $guzzleHttp = null;

	/**
	 * 静态方法内调用非静态方法
	 *
	 * @return Messages
	 */
	protected static function getGuzzleHttp(): Messages
	{
		if (static::$guzzleHttp == null) {
			static::$guzzleHttp = new self();
		}
		return static::$guzzleHttp;
	}

	/**
	 * 获取token
	 *
	 * @return string
	 */
	protected static function getAccessToken(): string
	{
		// 取出tokens
		$accessTokens = static::$accessTokens;
		// 随机取数组的一个key
		$key = array_rand($accessTokens);
		// 返回随机取到的token
		return $accessTokens[$key];
	}

	/**
	 * 发送消息
	 *
	 * @param $msg
	 */
	protected static function sendMsg($msg)
	{
		if (!static::$defaultSend || !$msg) {
			return;
		}
		$url = static::getUrl();
		$params = [
			'json' => $msg,
		];

		try {
			static::getGuzzleHttp()->guzzleHttpPost($url, $params);
		}catch (Throwable $ex){
			// @tips 屏蔽消息不做处理
		}
	}

	// 设置默认发送状态
	public static function setDefaultSendStatus(bool $status)
	{
		static::$defaultSend = $status;
	}

	/**
	 * 初始化tokens
	 */
	public static function initAccessToken(string $accessTokens)
	{
		if ($accessTokens) {
			static::$accessTokens = explode(',', $accessTokens);
		}
	}

	/**
	 * 设置url
	 */
	public static function getUrl(): string
	{
		return '';
	}

	/**
	 * 【关键词】「服务名称:服务的环境」异常关键词--Y-m-d,msg: 具体的内容json串
	 *
	 * @param string       $mark
	 * @param string|array $info
	 * @return string
	 */
	public static function makeMsg(string $mark, $info): string
	{
		$msg = '【错误】';  // @tips 前缀:必须包含钉钉机器人配置的前缀
		$msg .= '「' . env('APP_NAME', 'APP_NAME') . ':' . env('APP_ENV', 'APP_ENV') . '」';  // 应用服务名称&环境
		$msg .= $mark;                      // 异常类名
		$msg .= '--' . date("Y-m-d");  // 日期
		$msg .= ',msg:' . PHP_EOL;            // msg前缀
		$msg .= is_array($info) ? json_encode($info, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) : $info; // 具体的错误消息
		return $msg;
	}
}